import {
  MiddlewareConsumer,
  Module,
  NestModule,
  RequestMethod,
} from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ListModule } from './list/list.module';
import { ConfigModuel } from './config/config.modules';
import { LoggleMiddleware } from './loggle/loggle.middleware';
import { UploadModule } from './upload/upload.module';
import { GuardModule } from './guard/guard.module';

// @Module: @Module() 装饰器对其进行修饰, 等于实例了下面的class AppModule
// 模块，APP的Module就是总模块，集合了所有的代码导入到入口函数
@Module({
  // imports: 一个数组，用于导入当前模块所依赖的其他模块
  imports: [ListModule, ConfigModuel, UploadModule, GuardModule],
  // controllers: 一个数组，包含当前模块的控制器。控制器负责处理传入的 HTTP 请求，并返回响应
  controllers: [AppController],
  // providers(提供): 一个数组，包含当前模块的提供者(服务提供者)。提供者可以是服务、工厂或者其他可注入的组件
  providers: [
    AppService,
    // 提供一个自定义的服务，在controller就可以利用inject获取到该服务
    {
      provide: 'wujiajie',
      useValue: ['wujiajie--wujiajie'],
    },
  ],
})
// 在需要的模块注入中间件，NestModule类型中有中间件的类型
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    // 注入中间件，并且需要指定注入的地址
    consumer
      .apply(LoggleMiddleware)
      // 指定中间件拦截list路由的Get请求
      .forRoutes({ path: 'list', method: RequestMethod.GET });
    // 指定中间件拦截该Controller
    // .forRoutes(AppController);
  }
}
